メインコンテンツまでスキップ

Android SDK

ネイティブの Android アプリに AR Clip VPS を追加します。SDK は、ARCore 対応デバイスで VPS マップ上のユーザーの位置を特定します。Sceneform のフラグメントと、ライフサイクルを扱うヘルパーも付いています。

始める前に​

  • Android SDK 24(Android 7.0)以降
  • ARCore に対応したデバイス
  • Kotlin のプロジェクト(サンプルは Kotlin で書かれています)
API キーが必要ですか?

arclip.design で取得するか、support@arclip.design までメールでお問い合わせください。

インストール​

  1. プロジェクトが Maven Central からアーティファクトを取得できるようにします。

    allprojects {
    repositories {
    mavenCentral()
    // other repositories...
    }
    }
  2. アプリのモジュールに依存関係を追加します。

    dependencies {
    implementation "com.arstudio:wasvps-sdk:1.0.0"
    }
  3. Gradle を同期します。

マニフェストを設定する​

ARCore が必要であることを宣言します。アプリ自体の minSdk が 24 より低い場合は、ビルドが失敗しないように uses-sdk の上書きも追加します。それでも SDK 自体は Android 7.0(API 24)以降でしか動きません。

<!-- Only if your app's minSdk is below 24 -->
<uses-sdk tools:overrideLibrary="com.arstudio.wasvps_sdk, com.google.ar.sceneform.sceneform, com.google.ar.sceneform.ux" />

<!-- Restrict to ARCore hardware (default). Set required=false to broaden install base. -->
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />

Play ストアでより多くのデバイスにアプリを表示したい場合は、android:required="false" に設定し、SDK 側の値を置き換えるために tools:replace="android:required" を追加します。

<uses-feature
android:name="android.hardware.camera.ar"
android:required="false"
tools:replace="android:required" />

WASVPSArFragment ですばやく始める​

付属のフラグメントをレイアウトに追加します。

<!-- res/layout/activity_main.xml -->
<androidx.fragment.app.FragmentContainerView
android:id="@+id/vFragmentContainer"
android:name="com.arstudio.wasvps_sdk.ui.WASVPSArFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

supportFragmentManager.beginTransaction()
.replace(R.id.vFragmentContainer, WASVPSArFragment())
.commit()
}
}

ロケーション ID が用意できたら、サービスを取得してローカライズを開始します。

val fragment = supportFragmentManager
.findFragmentById(R.id.vFragmentContainer) as WASVPSArFragment

val config = WASVPSConfig.getIndoorConfig(listOf("your-location-id"))
val service = fragment.vpsService

service.setVpsConfig(config)
service.setVpsCallback(object : VpsCallback {
override fun onSuccess() = Unit
override fun onFail() = Unit
override fun onStateChange(state: State) = Unit
override fun onError(error: Throwable) {
Log.e("VPS", "Localization error", error)
}
})

service.startVpsService()

AR の体験を一時停止するとき(たとえば onPause の中)は、service.stopVpsService() を呼び出します。

独自のフラグメントを使う​

独自の ArFragment や ArSceneView がある場合は、WASVPSService を自分で作成して管理します。

class CustomArFragment : ArFragment() {
private val vpsService = WASVPSService.newInstance()

override fun onAttach(context: Context) {
super.onAttach(context)
WASVPSSdk.init(context.applicationContext)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
vpsService.bindArSceneView(arSceneView)
vpsService.setVpsConfig(WASVPSConfig.getOutdoorConfig(listOf("location-id")))
}

override fun onResume() {
super.onResume()
vpsService.resume()
vpsService.startVpsService()
}

override fun onPause() {
vpsService.pause()
vpsService.stopVpsService()
super.onPause()
}

override fun onDestroyView() {
vpsService.destroy()
super.onDestroyView()
}
}

コンテンツを配置する​

ノードは vpsService.worldNode の子として追加します。VPS のローカライズが成功すると、すべての子ノードが、特定されたグローバルな位置に合わせて配置されます。

val anchorNode = Node().apply {
setParent(vpsService.worldNode)
localPosition = Vector3(0f, 0f, -1f)
}

トラブルシューティング​

  • テスト用のデバイスに Google Play Services for AR がインストールされていて、最新の状態であることを確認してください。
  • ローカライズが一向に成功しない場合は、SDK に渡している API キー(安全な設定経由で渡してください)と、ロケーション ID が存在するかを確認してください。
  • 実行時の権限や UI を含む完全な例は、リポジトリの /sample モジュールにあります。